/**
 * eden满导致minorGC
 * 加入配置如下：
 * -XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760
 * -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
 * -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
 * 运行日志在根目录gc.log，看不懂就画图。
 */
public class EdenFull {
    public static void main(String[] args) throws InterruptedException {
        byte[] array1 = new byte[1024 * 1024];
        array1 = new byte[1024 * 1024];
        array1 = new byte[1024 * 1024];
        array1 = null;
        byte[] array2 = new byte[2 * 1024 * 1024];
    }

    /**
     * 首先我们来看第一行代码：byte[] array1 = new byte[1024 * 1024];。
     *
     * 这行代码一旦运行，就会在JVM的Eden区内放入一个1MB的对象，同时在main线程的虚拟机栈中会压入一个main()方法的栈帧，在main()
     * 方法的栈帧内部，会有一个“array1”变量，这个变量是指向堆内存Eden区的那个1MB的数组。
     *
     * 接着我们看第二行代码：array1 = new byte[1024 * 1024];
     *
     * 此时会在堆内存的Eden区中创建第二个数组，并且让局部变量指向第二个数组，然后第一个数组就没人引用了，此时第一个数组就成了没人引用的“垃圾对象”了。
     *
     * 然后看第三行代码：byte[] array1 = new byte[1024 * 1024];。
     *
     * 这行代码在堆内存的Eden区内创建了第三个数组，同时让array1变量指向了第三个数组，此时前面两个数组都没有人引用了，就都成了垃圾对象。
     *
     * 接着我们来看第四行代码：array1 = null;。
     *
     * 这行代码一执行，就让array1这个变量什么都不指向了，此时会导致之前创建的3个数组全部变成垃圾对象。
     *
     * 最后看第五行代码：byte[] array2 = new byte[2 * 1024 * 1024];。
     *
     * 此时会分配一个2MB大小的数组，尝试放入Eden区中，大家觉得这个时候Eden区能放的下吗？
     *
     * 明显是不行的，因为Eden区总共就4MB大小，而且里面已经放入了3个1MB的数组了，所以剩余空间只有1MB了，此时你放一个2MB的数组是放不下的。
     *
     * 所以这个时候就会触发年轻代的Young GC。
     */

}
